﻿using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using MacroprocesosWPF.Administrador.Administrador.ControUsuario;

namespace MacroprocesosWPF.Administrador
{
    /// <summary>
    /// Lógica de interacción para AdminPrincipal.xaml
    /// </summary>
    public partial class AdminPrincipal : Window
    {
        private object dummyNode = null;
        
        public AdminPrincipal()
        {
            InitializeComponent();
        }

        private void Window_Loaded_1(object sender, RoutedEventArgs e)
        {
            this.cargarArbolProcesos();
        }

        public void cargarArbolProcesos()
        {
            Unimaq.Macroprocesos.LogicaNegocio.EmpresaBLL empresaBLL = new Unimaq.Macroprocesos.LogicaNegocio.EmpresaBLL();
            List<Unimaq.Macroprocesos.AccesoDatos.Empresa> lista = empresaBLL.Listar();

            TreeProcesosUnimaq.Items.Clear();

            foreach (Unimaq.Macroprocesos.AccesoDatos.Empresa emp in lista)
            {
                TreeViewItem item = new TreeViewItem();
                item.Header = emp.NombreEmpresa;
                item.Tag = emp;
                item.FontWeight = FontWeights.Thin;
                item.Items.Add(dummyNode);
                item.Expanded += new RoutedEventHandler(empresa_Expanded);
                TreeProcesosUnimaq.Items.Add(item);
            }
        }

        private void empresa_Expanded(object sender, RoutedEventArgs e)
        {
            TreeViewItem item = (TreeViewItem)sender;

            if (item.Items.Count == 1 && item.Items[0] == dummyNode)
            {
                item.Items.Clear();                
                try
                {
                    if (item.Tag is Unimaq.Macroprocesos.AccesoDatos.Empresa)
                    {
                        Unimaq.Macroprocesos.AccesoDatos.Empresa selectedEmpresa = item.Tag as Unimaq.Macroprocesos.AccesoDatos.Empresa;
                        Unimaq.Macroprocesos.LogicaNegocio.ProcesoBLL procesoBLL = new Unimaq.Macroprocesos.LogicaNegocio.ProcesoBLL();
                        List<Unimaq.Macroprocesos.AccesoDatos.Proceso> lista = procesoBLL.Listar(selectedEmpresa);

                        foreach (Unimaq.Macroprocesos.AccesoDatos.Proceso proc in lista)
                        {
                            TreeViewItem subItem = new TreeViewItem();
                            subItem.Header = proc.Nombre;
                            subItem.Tag = proc;
                            subItem.FontWeight = FontWeights.Thin;
                            subItem.Items.Add(dummyNode);
                            subItem.Expanded += new RoutedEventHandler(empresa_Expanded);
                            item.Items.Add(subItem);
                        }
                        
                    }
                    else if (item.Tag is Unimaq.Macroprocesos.AccesoDatos.Proceso)
                    {
                        Unimaq.Macroprocesos.AccesoDatos.Proceso selectedProceso = item.Tag as Unimaq.Macroprocesos.AccesoDatos.Proceso;
                        Unimaq.Macroprocesos.LogicaNegocio.ProcesoBLL procesoBLL = new Unimaq.Macroprocesos.LogicaNegocio.ProcesoBLL();
                        List<Unimaq.Macroprocesos.AccesoDatos.Proceso> listaProc = procesoBLL.Listar(selectedProceso);

                        foreach (Unimaq.Macroprocesos.AccesoDatos.Proceso proc in listaProc)
                        {
                            TreeViewItem subItemProc = new TreeViewItem();
                            subItemProc.Header = proc.Nombre;
                            subItemProc.Tag = proc;
                            subItemProc.FontWeight = FontWeights.Thin;
                            subItemProc.Items.Add(dummyNode);
                            subItemProc.Expanded += new RoutedEventHandler(empresa_Expanded);
                            item.Items.Add(subItemProc);
                        }

                        Unimaq.Macroprocesos.LogicaNegocio.DocumentoBLL documentoBLL = new Unimaq.Macroprocesos.LogicaNegocio.DocumentoBLL();
                        List<Unimaq.Macroprocesos.AccesoDatos.Documento> listaDoc = documentoBLL.Listar(selectedProceso);

                        foreach (Unimaq.Macroprocesos.AccesoDatos.Documento doc in listaDoc)
                        {
                            TreeViewItem subItemDoc = new TreeViewItem();
                            subItemDoc.Header = doc.Nombre;
                            subItemDoc.Tag = doc;
                            subItemDoc.FontWeight = FontWeights.Thin;
                            item.Items.Add(subItemDoc);
                        }
                    }
                }
                catch{ }
            }
        }

        static TreeViewItem VisualUpwardSearch(DependencyObject source)
        {
            while (source != null && !(source is TreeViewItem))
            {
                source = VisualTreeHelper.GetParent(source);
            }

            return source as TreeViewItem;
        }

        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            //DialogAgregar dAgregar = new DialogAgregar();
            //dAgregar.ShowDialog();

            //string result = dAgregar.Insertar;

            //if (!string.IsNullOrWhiteSpace(result))
            //{
            //    switch (result)
            //    {
            //        case "EMPRESA":
            //            Empresa iuEmpresa = new Empresa();
            //            btnGuardar.Tag = "EMPRESA";

            //            Contenedor.Children.Clear();
            //            Contenedor.Children.Add(iuEmpresa);
            //            break;
            //        case "PROCESO":
            //            Proceso iuProceso = new Proceso();
            //            btnGuardar.Tag = "PROCESO";

            //            Contenedor.Children.Clear();
            //            Contenedor.Children.Add(iuProceso);
            //            break;
            //        case "DOCUMENTO":
            //            break;
            //    }
            //}
        }

        private void btnGuardar_Click(object sender, RoutedEventArgs e)
        {
            //if (Contenedor.Children.Count > 0)
            //{
            //    if (btnGuardar.Tag != null)
            //    {
            //        string activoUControl = btnGuardar.Tag.ToString();

            //        switch (activoUControl)
            //        {
            //            case "EMPRESA":
            //                Empresa activoEmpresa = Contenedor.Children[0] as Empresa;
            //                activoEmpresa.setToEmpresa();
            //                Unimaq.Macroprocesos.AccesoDatos.Empresa nuevoEmpresa = activoEmpresa.ValorEmpresa;

            //                //MessageBox.Show(this,nuevoEmpresa.NombreEmpresa.Trim() + "\n" + nuevoEmpresa.Descripcion, "Macroprocesos", MessageBoxButton.OK);
            //                Unimaq.Macroprocesos.LogicaNegocio.EmpresaBLL empresaBLL = new Unimaq.Macroprocesos.LogicaNegocio.EmpresaBLL();

            //                int resultEmpresa = empresaBLL.Registrar(nuevoEmpresa);

            //                activoEmpresa.LimpiaFormulario();
            //                cargarArbolProcesos();
            //                break;
            //            case "PROCESO":
            //                Proceso activoProceso = Contenedor.Children[0] as Proceso;
            //                activoProceso.setToProceso();
            //                Unimaq.Macroprocesos.AccesoDatos.Proceso nuevoProceso = activoProceso.ValorProceso;

            //                Unimaq.Macroprocesos.LogicaNegocio.ProcesoBLL procesoBLL = new Unimaq.Macroprocesos.LogicaNegocio.ProcesoBLL();
            //                int resultProceso = procesoBLL.Registrar(nuevoProceso);

            //                activoProceso.LimpiarFormulario();
            //                cargarArbolProcesos();
            //                break;
            //        }
            //    }
            //}
        }

        //public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
        //{
        //    if (depObj != null)
        //    {
        //        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
        //        {
        //            DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
        //            if (child != null && child is T)
        //            {
        //                yield return (T)child;
        //            }

        //            foreach (T childOfChild in FindVisualChildren<T>(child))
        //            {
        //                yield return childOfChild;
        //            }
        //        }
        //    }
        //}

        private void TreeProcesosUnimaq_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
        {

            TreeViewItem selectedItem = (TreeViewItem)TreeProcesosUnimaq.SelectedItem;

            if (selectedItem != null)
            {
                if (selectedItem.Tag is Unimaq.Macroprocesos.AccesoDatos.Empresa)
                {
                    Unimaq.Macroprocesos.AccesoDatos.Empresa selectedEmpresa = (Unimaq.Macroprocesos.AccesoDatos.Empresa)selectedItem.Tag;
                    Empresa iuEmpresa = new Empresa(selectedEmpresa);
                    Contenedor.Children.Clear();
                    Contenedor.Children.Add(iuEmpresa);
                }
                else if (selectedItem.Tag is Unimaq.Macroprocesos.AccesoDatos.Proceso)
                {
                    Unimaq.Macroprocesos.AccesoDatos.Proceso selectedProceso = (Unimaq.Macroprocesos.AccesoDatos.Proceso)selectedItem.Tag;
                    Proceso iuProceso = new Proceso(selectedProceso);
                    Contenedor.Children.Clear();
                    Contenedor.Children.Add(iuProceso);
                }
                else if (selectedItem.Tag is Unimaq.Macroprocesos.AccesoDatos.Documento)
                {
                    Unimaq.Macroprocesos.AccesoDatos.Documento selectedDocumento = (Unimaq.Macroprocesos.AccesoDatos.Documento)selectedItem.Tag;
                    Documento iuDocumento = new Documento(selectedDocumento);
                    Contenedor.Children.Clear();
                    Contenedor.Children.Add(iuDocumento);
                }
            }
        } 

        private void TreeProcesosUnimaq_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
        {
            TreeViewItem selectedItem = VisualUpwardSearch(e.OriginalSource as DependencyObject);            
            if (selectedItem != null)
            {
                selectedItem.Focus();
                e.Handled = true;                                      
            }
        }
        
        //private void menuItemAgregar_Click(object sender, RoutedEventArgs e)
        //{
        //    Unimaq.Macroprocesos.AccesoDatos.Empresa selectedEmpresa = (Unimaq.Macroprocesos.AccesoDatos.Empresa)TreeProcesosUnimaq.SelectedItem;
        //    if (selectedEmpresa != null)
        //    {
        //        selectedEmpresa = (Unimaq.Macroprocesos.AccesoDatos.Empresa)TreeProcesosUnimaq.SelectedItem;
        //        Proceso iuProceso = new Proceso(selectedEmpresa);

        //        Contenedor.Children.Clear();
        //        Contenedor.Children.Add(iuProceso);
        //    }
        //}

        private void menuItemAgregar_Click(object sender, RoutedEventArgs e)
        {
            TreeViewItem selectedItem = (TreeViewItem)TreeProcesosUnimaq.SelectedItem;

            if (selectedItem != null)
            {               
                if (selectedItem.Tag is Unimaq.Macroprocesos.AccesoDatos.Proceso)
                {
                    DialogAgregarSecundario dAgregar = new DialogAgregarSecundario();
                    dAgregar.ShowDialog();

                    string result = dAgregar.Insertar;
                    Unimaq.Macroprocesos.AccesoDatos.Proceso selectedProceso = (Unimaq.Macroprocesos.AccesoDatos.Proceso)selectedItem.Tag;
                    switch (result)
                    {
                        case "PROCESO":
                            Unimaq.Macroprocesos.LogicaNegocio.EmpresaBLL empresaBLL = new Unimaq.Macroprocesos.LogicaNegocio.EmpresaBLL();
                            Unimaq.Macroprocesos.AccesoDatos.Empresa empresaPadre = empresaBLL.GetEmpresa(selectedProceso);

                            if (empresaPadre != null)
                            {
                                Proceso iuProceso = new Proceso(empresaPadre, selectedProceso);

                                Contenedor.Children.Clear();
                                Contenedor.Children.Add(iuProceso);
                            }
                            break;

                        case "DOCUMENTO":
                            Documento iuDocumento = new Documento(selectedProceso);

                            Contenedor.Children.Clear();
                            Contenedor.Children.Add(iuDocumento);
                            break;
                    }
                }
                else if (selectedItem.Tag is Unimaq.Macroprocesos.AccesoDatos.Empresa)
                {

                }
            }
        }

        private void btnEmpresa_Click(object sender, RoutedEventArgs e)
        {
            Empresa iuEmpresa = new Empresa();
            Contenedor.Children.Clear();
            Contenedor.Children.Add(iuEmpresa);
        }

        private void btnProceso_Click(object sender, RoutedEventArgs e)
        {
            Proceso iuProceso = new Proceso();
            Contenedor.Children.Clear();
            Contenedor.Children.Add(iuProceso);
        }

        private void btnDocumento_Click(object sender, RoutedEventArgs e)
        {
            Documento iuDocumento = new Documento();
            Contenedor.Children.Clear();
            Contenedor.Children.Add(iuDocumento);
        }

        private void TextBlock_ContextMenuOpening_1(object sender, ContextMenuEventArgs e)
        {
            TreeViewItem selectedItem = VisualUpwardSearch(e.OriginalSource as DependencyObject);
            TextBlock selectedTextBlock = (TextBlock)sender;

            if (selectedItem != null)
            {
                if (selectedItem.Tag is Unimaq.Macroprocesos.AccesoDatos.Documento)
                {
                    ContextMenu selContextMenu = selectedTextBlock.ContextMenu;
                    selContextMenu.Visibility = Visibility.Collapsed;
                }
            }
        }
    }
}


//Revisar: WPF - How to create image button with template
//http://stackoverflow.com/questions/1261908/wpf-how-to-create-image-button-with-template